package com.code.soulnetty.modbus.client.channel.impl;

import com.code.soulnetty.modbus.client.message.ProtocolRequest;
import com.code.soulnetty.modbus.client.message.ProtocolResponse;

import java.net.SocketAddress;
import java.util.concurrent.CompletableFuture;

/**
 * @author lyf
 * @date 2022-12-17 0:20
 */
public interface ProtocolChannel {

    /**
     * 获取远程地址
     *
     * @return
     */
    SocketAddress getRemoteAddress();

    /**
     * 获取本地地址
     *
     * @return
     */
    SocketAddress getLocalAddress();

    /**
     * 是否连接中
     *
     * @return
     */
    boolean isConnected();

    /**
     * 发送消息
     *
     * @param request
     * @return
     */
    CompletableFuture<ProtocolResponse> send(ProtocolRequest request) throws Exception;

    /**
     * 接收数据
     *
     * @param response
     */
    void received(ProtocolResponse response);

    /**
     * 关闭通道
     */
    void close();

    /**
     * 关闭通道
     *
     * @param timeout
     */
    void close(int timeout);

    /**
     * 获取请求信息
     *
     * @param msgId
     * @return
     */
    ProtocolRequest request(String msgId);

    /**
     * 获取重试次数
     *
     * @return
     */
    int getRetryCount();

    /**
     * 获取超时时间
     *
     * @return
     */
    long getTimeout();

    /**
     * 获取轮训间隔的时间
     *
     * @return
     */
    long getReqIntl();
}
